// const num: number = 5;
// const  num: string = '的哇'

// const list1:number[] = [1,2,3];
// const list2:Array<number | string> = [1,'2',3];
// const list3:[string, number] = ['1',2];

// enum Color {Red, Green=2, Blue}

// let c:string = Color[2];

// let x: any = '12';
// console.log(x);
// x = 3;
// console.log(x);
// x = false
// function warnUser(): void{
//     console.log(1)
// }


// let someValue: any = "this is a string";
// let strLength: number = (<string>someValue).length

// let strLength: number = (someValue as string).length

// console.log(strLength);

// let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
// // let search = { ...defaults, food: "rich" };
// let search = { food: "rich", ...defaults}; // Error


// const o = {a: 123, b: '234', c: true}
// let {a, ...others} = o;


// const o = {a: 123, b: '234', c: true}
// let {a: name1, b:name2} = o;


// function aa(params:{a: string, b?: number}){
//     let {a, b = 1} = params;
//     console.log(a,b);
// }

// console.log(aa({a: '1'}));
// console.log(aa({a: '1', b: 2}));



// let first = [1,2];
// let second = [3,4]
// let both = [0, ...first, ...second, 5]

// console.log(both);

// interface Labelvalue{
//     label: string
//     a?: number
// }

// function printLabel(labelObj: Labelvalue){
//     console.log(labelObj.label)
// }

// const obj = { label:'sss'}
// printLabel(obj)

// interface Point{
//     readonly  x:number
//     readonly  y: number
// }

// let p: Point = {x: 123, y: 245};


interface Search{
    (source: string, subString: string): boolean
}
// let mySearch: Search
// mySearch = function(source: string, subString: string){
//     let result = source.search(subString)
//     return result >　-1 
// }
// let mySearch: Search = function(source: string, subString: string){
//     let result = source.search(subString)
//     return result >　-1 
// }


// console.log(
//     mySearch('123444', '23')
// )
// interface ClockInterface{
//     currentTime: Date;
// }

// class Clock implements ClockInterface {
//     currentTime: Date;
//     constructor(h: number, m: number){}
// }

// interface ClockInterface{
//     currentTime: Date;
//     setTime(d: Date)
// }

// class Clock implements ClockInterface {
//     currentTime: Date;
//     setTime(d: Date){
//         this.currentTime = d;
//     }
//     constructor(h: number, m: number){}
// }



// interface ClockConstructor {
//     new (hour: number, minute: number): ClockInterface;
// }

// interface ClockInterface {
//     tick();
// }


// function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
//     return new ctor(hour, minute);
// }


// interface Shape {
//     color: string;
// }

// interface   Square extends Shape{
//     sideLength: number;
// }

// let square = <Square>{};
// square.color = 'blue';
// square.sideLength = 10;
// console.log(square)


// interface Shape {
//     color: string;
// }

// interface PenStroke {
//     penWidth: number;
// }

// interface Square extends Shape, PenStroke {
//     sideLength: number
// }

// let square = <Square>{};

// square.color = "blue";
// square.sideLength = 10;
// square.penWidth = 5.0;
// console.log(square)


// interface Counter {  // 函数
//     (start: number): string;  // 参数start  返回  string
//     interval: number
//     reset(): void
// }

// function getCounter(): Counter{
//     var counter = <Counter>function(start: number){}
//     counter.interval = 123;
//     counter.reset = function(){}
//     return counter;
// }

// interface Test{
//     (arg1: String): void
// }
// var a = <Test>function(arg1:String){console.log(arg1)}



// class Greeter{
//     name: string = '123'
//     constructor(name: string){
//         this.name = name
//     }
//     greet(){
//         return 'hello '+this.name
//     }
// }

// class Ba extends Greeter{
//     constructor(name: string){ super(name)}
// }


// var b = new Ba('bb');
// var c = new Greeter('cc');
// console.log(b.greet());
// console.log(c.greet());



// class Employee {
//     fullName: string;
// }

// let employee = new Employee();
// employee.fullName = "Bob Smith";
// if (employee.fullName) {
//     console.log(employee.fullName);
// }

// let passcode = "secret passcode";

// class Employee {
//     private _fullName: string;
//     constructor(){
//         this._fullName = '111'
//     }
//     get fullName(): string {
//         return this._fullName;
//     }

//     set fullName(newName: string) {
//         if (passcode && passcode == "secret passcode") {
//             this._fullName = newName;
//         }
//         else {
//             console.log("Error: Unauthorized update of employee!");
//         }
//     }
// }

// let employee = new Employee();
// employee.fullName = "Bob Smith";
// if (employee.fullName) {
//     console.log(employee.fullName);
// }


// class Aa{
//     private _name: string
//     constructor(){
//         this._name = ''
//     }

//     get name(): string{
//         return this._name
//     }
//     set name(newValue: string){
//         if(newValue.length > 2){
//             this._name = newValue
//         }else{
//             console.log('Error: value length need >=3')
//         }
//     }
// }

// let a = new Aa();
// console.log(a.name);
// a.name = '12';
// a.name = '234';
// console.log(a.name);


// class A {
//     static base = {x : 0, y: 0}
//     move(point:{x: number, y:number}){
//         let x = point.x - A.base.x;
//         let y = point.y - A.base.y;
//         return Math.sqrt(x*x + y*y)/this.scale
//     }
//     constructor(public scale: number){}
// }

// let a1 = new A(1);
// let a2 = new A(5);
// console.log(a1.move({x: 10, y: 10}));
// console.log(a2.move({x: 10, y: 10}));




// abstract class Department {

//     constructor(public name: string) {
//     }

//     printName(): void {
//         console.log('Department name: ' + this.name);
//     }

//     abstract printMeeting(): string; // 必须在派生类中实现
// }

// class AccountingDepartment extends Department {

//     constructor() {
//         super('Accounting and Auditing'); // 在派生类的构造函数中必须调用 super()
//     }

//     printMeeting(): string {
//         console.log('The Accounting Department meets each Monday at 10am.');
//         return '1111'
//     }

//     generateReports(): void {
//         console.log('Generating accounting reports...');
//     }
// }

// let department: AccountingDepartment; // 允许创建一个对抽象类型的引用
// // department = new Department(); // 错误: 不能创建一个抽象类的实例
// department = new AccountingDepartment(); // 允许对一个抽象子类进行实例化和赋值
// department.printName();
// department.printMeeting();
// department.generateReports(); // 错误: 方法在声明的抽象类中不存在


// function a (name: string, age = '0', sex?: string){console.log(name, age, sex)}
// function b( fist: string, ...others: string[]){console.log(fist, others)}

// a('1','2', '3')
// b('1','2', '3')

// console.log(2**2);

// // let x = 16;
// // let y = 0000;

// console.log(
//     (16).toString(2)
// );

// console.log(
//     5 << 1
// );

// let arr = [4,5,6]
// for(let i in arr){
//     console.log(`A:${i}`) // '1', '2', '3'
// }
// for(let i of arr){
//     console.log(`B:${i}`) // '1', '2', '3'
// }

// const a  = {
//     name: '111',
//     info: {
//         age: 20
//     }
// }

// console.log(a.info?.sex);

// var a = new Map();

// a.set('name', 'xx');
// console.log(a);


// console.log(2**2);
// let c:any = {b:{
//     d:1
// }};
// console.log(c?.b?.d);

// var b = new Set([1,2,3]);
// console.log(Array.from(b));


// var items = [1,2,3,4,5];
// var it = items[Symbol.iterator]();
// it.next();

// var a = (args)=> console.log(1);
// var b = (args)=> {debugger; return console.log(2)};
// var c = (args)=> console.log(3);

// a(b(c(2)));
function sayHi(target){
    target.sayHi = () => {console.log('hi')}
}
@sayHi
class Person{
    constructor(){}
}



var p1 = new Person();
p1.sayHi()